/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.servicio.impl;

import com.ec.medical.entidades.Perfil;
import com.ec.medical.entidades.Rol;
import com.ec.medical.entidades.Usuario;
import com.ec.medical.enumeracion.RolesEnum;
import com.ec.medical.exepciones.PerfilException;
import com.ec.medical.servicio.PerfilServicioLocal;
import com.ec.medical.servicio.RolServicioLocal;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.Query;
import org.apache.log4j.Logger;

/**
 *
 * @author Administrador
 */
@Stateless
public class PerfilServicioImpl extends ServicioBase<Perfil> implements PerfilServicioLocal {

     private Logger LOG = Logger.getLogger(PerfilServicioImpl.class.getName());
    @EJB
    private RolServicioLocal rolServicio;

    public PerfilServicioImpl() {
        super(Perfil.class);
    }

    /**
     * MEtodo que recupera el perfil de una usuario por su rol
     *
     * @param usuario
     * @param rolEnum
     * @return
     */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public Perfil obtenerPerfilPorUsuarioYRol(Usuario usuario, RolesEnum rolEnum) {
        Rol rol = rolServicio.obtenerPorIdentificador(rolEnum.getIdentificador());
        Query query = em.createNamedQuery("Perfil.obtenerPorUsuarioYRol");
        query.setParameter("codigoUsuario", usuario.getCodigoUsuario());
        query.setParameter("codigoRol", rol.getCodigoRol());
        return (Perfil) query.getSingleResult();
    }
    
    /**
     * MEtodo que elimina los perfiles relacionados a un usuario
     * @param usuario
     * @throws PerfilException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
   public void eliminarPerfilesDeUsuario(Usuario usuario) throws PerfilException{
        try{
            Query query = em.createNamedQuery("Perfil.eliminarPorUsuario");
            query.setParameter("codigoUsuario", usuario.getCodigoUsuario());
            query.executeUpdate();
        }catch(Exception e){
             LOG.error("..eliminarPerfilesDeUsuario Error " + e);
            throw new PerfilException("Error al eliminar perfil");
        }
    }
    
    /**
     * Metodo que crea una nueva entidad Pefil
     * @param perfil
     * @throws PerfilException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
  public void crearPerfil(Perfil perfil) throws PerfilException{
        try{
            this.create(perfil);
        }catch(Exception e){
            LOG.error("..crearPerfil Error " + e);
            throw new PerfilException("Error al crear perfil");
        }
    }
}
